package com.itheima.reggie.web;

import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
@WebFilter(filterName = "loginCheckFilter ")
//@webfilter web阶段的注解  作用: web项目启动的时候  会发现这个注解
//                           就会创建Filter对象    现在对象交给了spring搞了
//                          自动扫描  要在启动类李添加 注解
//                          @ServletComponentScan
public class LoginCheckFilter implements Filter {




    private String[] authURL=new String[]{
            //此为定义放行路径
            "/backend/**",
            "/front/**",
            "/employee/login",
            "/employee/logout",
            "/common/**",
            // 放行登录请求  验证码 请求
            "/user/sendMsg",
            "/user/login",
            "/doc.html",
            "/webjars/**",
            "/swagger-resources",
            "/v2/api-docs"

    };



    private boolean isCeckUrl(String requestURI) {
        AntPathMatcher pathMatcher = new AntPathMatcher();
        for (String url : authURL) {
            //pathMatcher.match 是一个判断方法  里面放要判断的两个对象
            //如果一样  返回true  就证明放行
            if (pathMatcher.match(url,requestURI)){
                return true;
            }
        }
        return false;
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {



  //1:  要获取本次前端请求的uri    涉及到向下转型
        HttpServletRequest request=(HttpServletRequest) req;
        HttpServletResponse response=(HttpServletResponse) resp;
        //获取操作 :
        String requestURI = request.getRequestURI();
       // log.info(requestURI+"别过滤拦住了.......");
        //2:拿到  请求路径  与 自定义的放行路径进行比对.
        boolean ischeck = isCeckUrl(requestURI);
        //boolean ceckUrl = isCeckUrl(requestURI);

        //如果此结果为true 就放行
        if (ischeck){
            //判断访问的路径是不需要拦截的  所有直接放行
            chain.doFilter(request,response);

            return;
        }
        //获取session中的缓存,查看是否用户在后台是登录过的还是没有
        Object employee = request.getSession().getAttribute("employee");

        if (employee!=null){  //不等于null  证明用户有登陆过 直接放行

            ///自动填充
            BaseContext.setCurrentId((Long)employee);
            //放行操作
            chain.doFilter(request,response);


           return;
        }
        //将来这块还得判断, 前台用户是否登录成功;
        Object userID = request.getSession().getAttribute("user");
        if (userID!=null){   //判断是否登录  此为登录  可以放行
            log.info("登录检查,前台用户已经登录,可以放行"+userID);
            //查看线程id
            long id = Thread.currentThread().getId();
            log.info("当前线程id"+id);
            // 在过滤器这里 把userID存到 一个线程中
            BaseContext.setCurrentId((Long) userID);
            chain.doFilter(request,response);
            return;
        }


        //如果代码走到这里  说明路径也是被拦截了   也没登陆过  全被拦截
        log.info("因为没登陆,所有没权限,请登录");
        //给出一个错误信息
        R  r = R.error("NOTLOGIN");
        //转换为Json数据给前端
        String s = JSON.toJSONString(r);
        //响应给前端
        response.getWriter().write(s);
    }






    public void destroy() {

    }

    public void init(FilterConfig config) throws ServletException {

    }

}
